package com.tiancheng.trade.authserver.controller;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.oauth2.SaOAuth2Manager;
import cn.dev33.satoken.oauth2.config.SaOAuth2ServerConfig;
import cn.dev33.satoken.oauth2.processor.SaOAuth2ServerProcessor;
import cn.dev33.satoken.oauth2.template.SaOAuth2Util;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.tiancheng.trade.authserver.model.LoginRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @ClassName SsoServerController
 * @Description SSO Server端 Controller
 * @Author kellen
 * @Date 2024/10/20 20:17
 */
@Slf4j
@RestController
public class SsoServerController {

    // OAuth2-Server 端：处理所有 OAuth2 相关请求
    @RequestMapping("/oauth2/*")
    public Object request() {
        log.info("------- 进入请求:{} " , SaHolder.getRequest().getUrl());
        return SaOAuth2ServerProcessor.instance.dister();
    }


//    /**
//     * 登录接口
//     */
//    @RequestMapping("/oauth2/pwdLogin")
//    public Object doLogin(LoginRequest loginRequest) {
//        log.info("------- 进入请求: " + SaHolder.getRequest().getUrl());
//        // 注意，此处是一个Demo写法，判断登陆类型为1通过，其它都为false
//        // 实际生产中。我们的登陆是支持多种登陆方式的。例如：账号+密码，手机—+验证码，扫码登陆，SDK唤醒
//        if ("1".equals(loginRequest.getLoginType())) {
//            StpUtil.login("10001");
//            return null;
//        } else if ("2".equals(loginRequest.getLoginType())) {
//            throw new RuntimeException("登陆失败");
//        }
//
//        return new RuntimeException("无效的请求，请查收");
//    }

    // ---------- 开放相关资源接口： Client端根据 Access-Token ，置换相关资源 ------------

    // 获取 userinfo 信息：昵称、头像、性别等等
    @RequestMapping("/oauth2/userinfo")
    public SaResult userinfo() {
        // 获取 Access-Token 对应的账号id
        String accessToken = SaOAuth2Manager.getDataResolver().readAccessToken(SaHolder.getRequest());
        Object loginId = SaOAuth2Util.getLoginIdByAccessToken(accessToken);
        System.out.println("-------- 此Access-Token对应的账号id: " + loginId);

        // 校验 Access-Token 是否具有权限: userinfo
        SaOAuth2Util.checkAccessTokenScope(accessToken, "userinfo");

        // 模拟账号信息 （真实环境需要查询数据库获取信息）
        Map<String, Object> map = new LinkedHashMap<>();
        // map.put("userId", loginId);  一般原则下，oauth2-server 不能把 userId 返回给 oauth2-client
        map.put("nickname", "林小林");
        map.put("avatar", "http://xxx.com/1.jpg");
        map.put("age", "18");
        map.put("sex", "男");
        map.put("address", "山东省 青岛市 城阳区");
        return SaResult.ok().setMap(map);
    }
}
